<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>作用域</title>
  </head>
  <body>
    <!-- 
        局部作用域分为：
            全局作用域、函数作用域、块级作用域

            函数内部的变量不能被外部访问
            函数的参数也是函数内部的一个局部变量
            不同函数内部声明的变量无法互相访问
            函数执行完毕后，函数内部的变量实际是被清空了的
        
        注意：在js中只有函数是有作用域的，有{}的地方都是块级作用域--这是es6所产生的有let和const的地方是有块级作用的
        ，包含的代码称为代码块，代码块内部声明的变量外部将【有可能】无法访问
              例子：
                当变量是声明为var的时候外部可以访问代码块外的数据
                for (var i = 0; i < 5; i++) {
                    console.log(i);
                }
                 console.log(i);
                    

        1、函数作用域：
            在函数内部声明的变量只能在函数的内部被访问，外部的无法直接访问
        2、块级作用域：
            let和const声明的变量会产生块级作用域
            不同代码块之间的变量是无法被访问的
            推荐使用let和const 

        全局作用域：
            <script>标签中和 .js 文件中的就是全局作用域
            注意：尽可能少的声明全局变量，防止全局变量被污染

        作用域链：
                作用域链本质上是底层的变量查找机制
                在函数被执行时，会优先查找当前函数作用域中查找变量
                如果当前作用域查找不到则会依次逐级查找父级作用域直到全局作用域
                父级作用域是无法访问子级作用域的

     -->

    <script>
        // 外部访问块中数据，var的时候可以
      for (var i = 0; i < 5; i++) {
        console.log(i);
      }
      console.log(i);
    //   for ( let = 0; i < 5; i++) {  
    //     console.log(i);
    //   }
    //   console.log(i); // 将会报错
    </script>
  </body>
</html>
